package View;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

import Pojo.Disciplina;
import Pojo.Professor;
import Pojo.Turma;
import View.MenuTurma.Comparador;

import DAO.ProfessorDaoImplArquivo;

/** Classe de operações referentes ao professor.
*
* @author Thiago de Sousa Silveira
* 
* */
public class MenuProfessor {

	/**
	 * Classe comparador para ordenar as Professor
	 * @author Thiago de Sousa Silveira
	 *
	 */
	public class Comparador implements Comparator<Professor>{
		/**
		 * Método de comparação que implementa o método de Comparator
		 */
		public int compare(Professor professor1, Professor professor2){
			return professor1.getNome().compareTo(professor2.getNome());
		}
	}
	
	/**Método para cadastro de Professores
	 * 
	 * @param professorDao
	 */
	public void cadastrarProfessores(ProfessorDaoImplArquivo professorDao){
		System.out.println("-----Cadastrando Novo Professor-----");
		int continuar=1;
		while(continuar==1){
			int idProfessor = professorDao.getProximoId();
			
			System.out.println("Informe o nome do Professor: ");
			String nome = Console.readString();
			
			System.out.println("Informe o cpf do Professor: ");
			String cpf = Console.readString();
			
			System.out.println("Informe o departamento do Professor: ");
			String departamento = Console.readString();
			
			List<Turma> listaTurma = new ArrayList<Turma>();
			
			Professor novoProfessor = new Professor(idProfessor,nome,cpf,departamento,listaTurma);
			professorDao.adicionarProfessor(novoProfessor);	
		
			System.out.println("Deseja cadastrar mais um professor? (1-Sim, 0-Não)");
			continuar = Console.readInteger();
		}
	}
	
	/**Método para escolha de professor dentre os listados.
	 * 
	 */
	public int escolherProfessores(ProfessorDaoImplArquivo professorDao){
		System.out.println("---Professores Cadastrados---");
		
		List<Professor> listaProfessores = professorDao.getListaProfessores();
		Iterator<Professor> i = listaProfessores.iterator();
		Professor professor;
		while(i.hasNext()){
			professor = (Professor) i.next();
			System.out.println(professor.getIdProfessor() + " - "+ professor.getNome());
		}
		return(listaProfessores.size());
	}
	
	/**Método para listagem de professores.
	 * 
	 * @param professorDao
	 */
	public void listarProfessores(ProfessorDaoImplArquivo professorDao){
		System.out.println("---Lista de Professores---");
		
		List<Professor> listaProfessores = professorDao.getListaProfessores();
		Comparador comparador = new Comparador();
		Collections.sort(listaProfessores,comparador);
		
		Iterator<Professor> i = listaProfessores.iterator();
		Professor professor;
		System.out.println("Código | Nome | CPF | Departamento");
		while(i.hasNext()){
			professor = (Professor) i.next();
			System.out.println(professor.getNome()+ " | " + professor.getCpf()+ " | " + professor.getDepartamento());
		}
		System.out.println("Pressione enter para retornar.");
		Console.readString();
	}
	
	/**Método para cálculo de quantidade de turmas lecionadas por um professor.
	 * 
	 * @param professorDao
	 */
	public void calcularQtdTurmasParaProfessor(ProfessorDaoImplArquivo professorDao){
		System.out.println("----- Cálculo do número de Turmas Para Um Professor -----");
		int idProfessor;
		int continuar=1;
		
		while (continuar==1){
			//Requisitando a Disciplina 
			this.escolherProfessores(professorDao);
			idProfessor = Console.readInteger();
			Professor professor = professorDao.procurarPorId(idProfessor);
			while (professor == null){
				System.out.println("Entrada inválida. Informe novamente:");
				idProfessor = Console.readInteger();
				professor = professorDao.procurarPorId(idProfessor);
			}
			
			List<Turma> listaTurmas = professor.getTurmas();
			
			System.out.println("O professor "+professor.getNome()+" lecionou "+listaTurmas.size()+" turmas");
			
			Iterator<Turma> i = listaTurmas.iterator();
			List<Disciplina> listaDisciplina = new ArrayList<Disciplina>();
			Turma turma;
			int qtdDisciplina=0;
			while(i.hasNext()){
				turma = (Turma) i.next();
				if (!listaDisciplina.contains(turma.getDisciplina())){
					listaDisciplina.add(turma.getDisciplina());
					qtdDisciplina++;
				}
			}
			
			System.out.println("O professor "+professor.getNome()+" lecionou "+qtdDisciplina+" disciplinas distintas");
			
			System.out.println("\nDeseja analisar a quantidade de disciplinas lecionadas por outros professores? (1-Sim 0-Não)");
			continuar = Console.readInteger();
		}
	}
}
